import fs from 'fs-extra';
import path from 'path';
import { ParserMode } from '../parser/parserFactory';

/**
 * 配置接口
 */
export interface Config {
  // 要扫描的组件路径
  scanPaths?: string[];
  // 服务器端口
  port?: number;
  // 输出路径
  outputPath?: string;
  // Vue版本 (2, 3, 或 auto)
  vueVersion?: '2' | '3' | 'auto';
  // 解析器模式
  parserMode?: ParserMode;
  // 国际化配置
  i18n?: {
    // 默认语言
    defaultLocale?: string;
    // 可用语言
    locales?: string[];
  };
  // 主题配置
  theme?: {
    // 主题名称
    name?: string;
    // 主色调
    primaryColor?: string;
    // 辅助色调
    secondaryColor?: string;
    // 暗色模式
    darkMode?: boolean;
  };
}

/**
 * 默认配置
 */
const DEFAULT_CONFIG: Config = {
  scanPaths: ['src/components'],
  port: 3000,
  outputPath: './vuelens-docs',
  vueVersion: 'auto',
  parserMode: ParserMode.ENHANCED,
  i18n: {
    defaultLocale: 'zh-CN',
    locales: ['zh-CN', 'en-US']
  },
  theme: {
    name: 'default',
    primaryColor: '#409eff',
    secondaryColor: '#67c23a',
    darkMode: false
  }
};

/**
 * 加载配置文件
 * @param configPath 配置文件路径
 * @returns 配置对象
 */
export function loadConfig(configPath: string): Config {
  const config: Config = { ...DEFAULT_CONFIG };
  
  try {
    // 检查配置文件是否存在
    if (fs.existsSync(configPath)) {
      console.log(`加载配置文件: ${configPath}`);
      
      // 根据文件扩展名决定如何加载配置
      const ext = path.extname(configPath);
      
      if (ext === '.js' || ext === '.cjs') {
        try {
          // 尝试加载JS配置文件
          const userConfig = require(path.resolve(configPath));
          return { ...config, ...userConfig };
        } catch (error) {
          console.error(`加载JS配置文件失败:`, error);
        }
      } else if (ext === '.json') {
        try {
          // 尝试加载JSON配置文件
          const content = fs.readFileSync(configPath, 'utf-8');
          const userConfig = JSON.parse(content);
          return { ...config, ...userConfig };
        } catch (error) {
          console.error(`加载JSON配置文件失败:`, error);
        }
      } else {
        console.warn(`不支持的配置文件格式: ${ext}`);
      }
    } else {
      console.log(`配置文件不存在: ${configPath}，使用默认配置`);
    }
  } catch (error) {
    console.error(`加载配置文件时出错:`, error);
  }
  
  return config;
}

/**
 * 生成默认配置文件
 * @param outputPath 输出路径
 */
export async function generateDefaultConfig(outputPath: string): Promise<void> {
  try {
    const configJS = `module.exports = ${JSON.stringify(DEFAULT_CONFIG, null, 2)};`;
    await fs.writeFile(outputPath, configJS);
    console.log(`默认配置文件已生成到: ${outputPath}`);
  } catch (error) {
    console.error(`生成默认配置文件失败:`, error);
    throw error;
  }
} 